package main

import (
	"io"
	"log"
	"net"
	"net/http"
	"sync"
	"time"
)

var (
	client *http.Client
	once   sync.Once // 一个实现单例模式的工具
)

func CreateHTTPClient() *http.Client {
	// 这里是使用固定的参数计算设置，后续升级为同一资源管理
	once.Do(func() {
		dialer := net.Dialer{
			Timeout:   30 * time.Second,
			KeepAlive: 30 * time.Second,
		}
		client = &http.Client{
			Transport: &http.Transport{
				DialContext:         dialer.DialContext, // 这里是一个问题，不能将一个方法直接赋值给一个字段，在外面进行将一个字段定义，然后在里面进行赋值
				MaxIdleConns:        100,                // 最大连接数
				MaxIdleConnsPerHost: 100,
				IdleConnTimeout:     90 * time.Second,
			},
		}
	})
	return client
}

func server() {
	//resp, err := http.Get("http://localhost:2025/hufeng")
	//if err != nil {
	//	log.Fatal(err)
	//}
	//defer resp.Body.Close()
	//bytes, err := io.ReadAll(resp.Body)
	//if err != nil {
	//	log.Fatal(err)
	//}
	//fmt.Println(resp.StatusCode, string(bytes))

	client := CreateHTTPClient()

	resp, err := client.Get("http://localhost:2025/hufeng")
	if err != nil {
		log.Fatal(err)
	}
	defer resp.Body.Close()
	bytes, err := io.ReadAll(resp.Body)
	if err != nil {
		log.Println(err)
	}
	log.Println(resp.StatusCode, resp.Request, string(bytes))

	//request, err := http.NewRequest("GET", "http://localhost:2025/hufeng", nil)
	//if err != nil {
	//	log.Fatal(err)
	//}
	//response, err := client.Do(request)
	//if err != nil {
	//	log.Fatal(err)
	//}
	//defer response.Body.Close()
	//fmt.Fprintf(os.Stdout, response.Request.RequestURI)
}
